//
// Created by Jisam on 2024/8/14 20:14.
// solve b2
#include <bits/stdc++.h>

#define endl "\n"
#define PSI pair<string,int>
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define VVI vector<vector<int>>
#define VI vector<int>
#define VS vector<string>

#define PQLI priority_queue<int, vector<int>, less<int>>
#define PQGI priority_queue<int, vector<int>, greater<int>>
#define u32 unsigned
#define i64 long long
#define u64 unsigned long long

using namespace std;


void solve() {
    // 读取整数n和m，分别代表矩阵的行数和列数
    int n, m;
    cin >> n >> m;

    // 初始化两个向量r和c，分别用于存储每行和每列数字的和
    vector<int> r(n), c(m);

    // 第一次读取矩阵，计算每行和每列的数字和
    for (int i = 0; i < n; i++) {
        string s;
        cin >> s;
        for (int j = 0; j < m; j++) {
            // 将字符转换为数字并累加到对应的行和列上
            r[i] += s[j] - '0';
            c[j] += s[j] - '0';
        }
    }

    // 第二次读取矩阵，减去每行和每列的数字和
    for (int i = 0; i < n; i++) {
        string s;
        cin >> s;
        for (int j = 0; j < m; j++) {
            // 减去对应的行和列的数字
            r[i] -= s[j] - '0';
            c[j] -= s[j] - '0';
        }
    }

    // 检查每行和每列的数字和是否能被3整除
    bool ok = true;
    for (int i = 0; i < n; i++) {
        if (r[i] % 3 != 0) {
            ok = false;
        }
    }
    for (int j = 0; j < m; j++) {
        if (c[j] % 3 != 0) {
            ok = false;
        }
    }

    // 根据检查结果输出YES或NO
    if (ok) {
        cout << "YES\n";
    } else {
        cout << "NO\n";
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T = 1;
    cin >> T;
    while (T--) solve();
//    cout << "\n"[];
    return 0;
}